package File_IO;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-02-11
 * Time: 16:47
 */

// 扫描指定目录, 并找到名称或者内容中包含指定字符得所有普通文件(不包含目录)

public class IODemo9 {

    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描得目录: ");
        String rootPath = scanner.next();

        // 以扫描得根目录创建文件对象
        File rootDir = new File(rootPath);

        // 判断创建得文件对象得路径是否为目录
        if(!rootDir.isDirectory()) {
            System.out.println("文件不存在或者不是目录!");
            return;
        }

        System.out.println("请输入要查找得文件名中得字符: ");
        String token = scanner.next();

        // 将扫描得文件都存放在result文件数组中
        List<File> result = new ArrayList<>();

        // 由于根目录下得文件可能是目录或者子文件, 为树状结构,采取递归遍历
        searchDir(rootDir, token, result);

        // 展示搜索结果
        System.out.println("共计找到以下相关文件: " + result.size() + "个, 分别为如下文件: ");
        for (File file : result) {
            System.out.println(file.getCanonicalPath());
        }
    }

    private static void searchDir(File rootDir, String token, List<File> result) throws IOException {

        // 列出当前根目录下得文件暂存于file文件数组中操作
        File[] files = rootDir.listFiles();

        if(files == null) {
            // 为null表示该文件目录不存在
            // file.length == 0 表示当前根目录下没有文件
            return;
        }

        for (File file : files) {
            if(file.isDirectory()) {
                // 是目录 继续递归
                searchDir(file, token, result);
            }else {
                // 处理子文件
                if(isContains(file, token)) {
                    // 返回该文件得绝对路径
                    result.add(file.getAbsoluteFile());
                }
            }
        }
    }

    private static boolean isContains(File file, String token) throws IOException{

        StringBuilder sb = new StringBuilder();

        try(InputStream is = new FileInputStream(file)) {

            // 创建一个新得字符输入流对象 全部转化为 UTF-8
            try (Scanner scanner = new Scanner(is, "UTF-8")) {
                while (scanner.hasNextLine()) {
                    sb.append(scanner.nextLine());
                    sb.append("\r\n"); // 转行符号
                }
            }
        }

        //  返回 包含该字符串
        return sb.indexOf(token) != -1;  //  不包含该字符串返回-1
    }
}
